#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include<time.h>

int cmpr(const void *a, const void *b) {
    return strcmp(*(char **)a, *(char **)b);
}

int main(void) {
	FILE *pArq, *pFiltro;
	char caracter, palavra[100], **listaPalavras;
	int pPalavra = 0, i, pMatriz = 0, nPalavras = 0;
	clock_t inicio = 0, fim = 0;
    inicio = clock();

	listaPalavras = (char**)malloc( 200000 * sizeof(char*) );
  	for(i = 0; i < 200000; i++) {
    	listaPalavras[i] = (char*)malloc( 100 * sizeof(char) );
  	}

	pArq = fopen ( "palavras.txt" , "r" );

	if (pArq == NULL) {
		fputs ("File error\n",stderr);
		exit (1);
	}

	while(!feof(pArq)) {
		fscanf (pArq,"%c",&caracter);
		if(caracter != ',' && caracter != ' ' && caracter != '\n' && caracter != '\r') {
			palavra[pPalavra] = tolower(caracter);
			pPalavra++;
		}
		else {
			palavra[pPalavra] = '\0';
			pPalavra = 0;
			nPalavras++;

            //Imprime . ao chegar as 100000 palavras
			if(nPalavras%100000 == 0 && nPalavras != 0) {
                printf(". ");
            }
			//printf("%s %d\n", palavra, nPalavras);

			for(i = 0; i < 200000; i++) {
                if(i == pMatriz) { //chegou no fim da lista e nao tem a palavra
                    strcpy(listaPalavras[i], palavra);
                    pMatriz++;
                    i = 200000;
                    //printf("Inseriu a palavra %s na matriz\n", palavra);
                }
                else if(strcmp(palavra, listaPalavras[i]) == 0) {
                    i = 200000;
                }
            }
		}
	}

	fclose (pArq);

	qsort(listaPalavras, pMatriz, sizeof(char*), cmpr);

	pFiltro = fopen ( "filtrado.txt" , "w" );

	if (pFiltro == NULL) {
		fputs ("File error\n",stderr);
		exit (1);
	}

	fprintf(pFiltro, "%d\n", pMatriz);

	for(i = 0; i < pMatriz; i++) {
		fprintf(pFiltro, "%s\n", listaPalavras[i]);
	}

	fim  = clock();
	double  tempo = (fim - inicio)/CLOCKS_PER_SEC;
	printf("\ntempo = %lf minutos\n", tempo/60);

	fclose (pFiltro);
	return 0;
}
